/*-------------------------------------------------------------------------
 *
 * relpath.h
 *		GetRelationPath()及相关函数的声明
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/include/common/relpath.h
 *
 *-------------------------------------------------------------------------
 */
#ifndef RELPATH_H
#define RELPATH_H

/*
 *	这里需要 'pgrminclude ignore' 因为 CppAsString2() 不会在
 *	符号未定义时抛出错误。
 */
#include "catalog/catversion.h" /* pgrminclude 忽略 */


/*
 * 主要版本特定表空间子目录的名称
 */
#define TABLESPACE_VERSION_DIRECTORY	"PG_" PG_MAJORVERSION "_" \
									CppAsString2(CATALOG_VERSION_NO)

/* 允许在关系路径中使用的 OID 字符 */
#define OIDCHARS		10		/* %u 打印的最大字符数 */

/*
 * 与 fork 名称相关的内容。
 *
 * 关系的物理存储由一个或多个 fork 组成。
 * 主 fork 始终创建，但除此之外，还可以有
 * 额外的 fork 用于存储各种元数据。当我们需要
 * 引用关系中的特定 fork 时使用 ForkNumber。
 */
typedef enum ForkNumber
{
	InvalidForkNumber = -1,
	MAIN_FORKNUM = 0,
	FSM_FORKNUM,
	VISIBILITYMAP_FORKNUM,
	INIT_FORKNUM

	/*
	 * 注意：如果添加新 fork，请更改 MAX_FORKNUM，可能还要
	 * 更改下面的 FORKNAMECHARS，并更新
	 * src/common/relpath.c 中的 forkNames 数组
	 */
} ForkNumber;

#define MAX_FORKNUM		INIT_FORKNUM

#define FORKNAMECHARS	4		/* fork 名称的最大字符数 */

extern PGDLLIMPORT const char *const forkNames[];

extern ForkNumber forkname_to_number(const char *forkName);
extern int	forkname_chars(const char *str, ForkNumber *fork);

/*
 * 计算关系的文件系统路径名的内容。
 */
extern char *GetDatabasePath(Oid dbNode, Oid spcNode);

extern char *GetRelationPath(Oid dbNode, Oid spcNode, Oid relNode,
							 int backendId, ForkNumber forkNumber);

/*
 * GetRelationPath 的包装宏。注意可能的
 * RelFileNode 或 RelFileNodeBackend 参数的多次评估！
 */

/* 第一个参数是 RelFileNode */
#define relpathbackend(rnode, backend, forknum) \
	GetRelationPath((rnode).dbNode, (rnode).spcNode, (rnode).relNode, \
					backend, forknum)

/* 第一个参数是 RelFileNode */
#define relpathperm(rnode, forknum) \
	relpathbackend(rnode, InvalidBackendId, forknum)

/* 第一个参数是 RelFileNodeBackend */
#define relpath(rnode, forknum) \
	relpathbackend((rnode).node, (rnode).backend, forknum)

#endif							/* RELPATH_H */
